iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
AI & Data

Diffusion 模型、物件偵測Yolo v7& Yolo v4 系列 第 23

DAY 23 YOLOv4 MNIST手寫數字辨識資料 -2

  • 分享至 

  • xImage
  •  
tags: 第 16 屆 iThome 鐵人賽 (2023)

{%hackmd BJrTq20hE %}

多層感知器模型資料前處理

  • 建立 多層感知器模型 (MLP), 須先將 images 與 labels 的內容進行前處理, 才能餵進去 Keras 預期的資料結構.
# 1.features (數字影像的特徵值) 資料前處理 
# 先將 image 以 reshape 轉換為二維 ndarray 並進行 normalization (Feature scaling): 
x_Train = X_train_image.reshape(60000, 28*28).astype('float32')  
x_Test = X_test_image.reshape(10000, 28*28).astype('float32')  
print("\t[Info] xTrain: %s" % (str(x_Train.shape)))  
print("\t[Info] xTest: %s" % (str(x_Test.shape)))  
# Normalization  
x_Train_norm = x_Train/255  
x_Test_norm = x_Test/255
輸出:
>>>[Info] xTrain: (60000, 784)
>>>[Info] xTest: (10000, 784)
# 2.labels (影像數字真實的值) 資料前處理 
y_TrainOneHot = np_utils.to_categorical(y_train_label) 
# 將 training 的 label 進行 one-hot encoding
y_TestOneHot = np_utils.to_categorical(y_test_label) 
# 將測試的 labels 進行 one-hot encoding
# 檢視 training labels 第一個 label 的值
print (y_train_label[0]) 
# 檢視第一個 label 在 one-hot encoding 後的結果, 會在第六個位置上為 1, 其他位置上為 0
print(y_TrainOneHot[:1]) 
輸出:
>>>5
>>>[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]

label 標籤欄位原本是 0-9 數字, 而為了配合 Keras 的資料格式, 必須進行 One-hot-encoding 將之轉換為 10 個 0 或 1 的組合, 例如數字 7 經過 One-hot encoding 轉換後是 0000001000, 正好對應到輸出層的 10 個神經元.

建立模型

  • 建立多層感知器 Multilayer Perceptron 模型:
    輸入層 (x) 共有 28x28=784 個神經元, Hidden layers (h) 共有 256 層; 輸出層 (y) 共有 10 個 神經元
from keras.models import Sequential  
from keras.layers import Dense  
  
model = Sequential()  # Build Linear Model  
model.add(Dense(units=256, input_dim=784, kernel_initializer='normal', activation='relu')) # Add Input/hidden layer  
model.add(Dense(units=10, kernel_initializer='normal', activation='softmax')) # Add Hidden/output layer  
print("\t[Info] Model summary:")  
model.summary()  
print("")

輸出:

進行訓練

  • 建立深度學習模型後, 使用 Backpropagation 進行訓練
# 在訓練模型之前, 我們必須先使用 compile 方法, 對訓練模型進行設定
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
  • loss: 設定 loss function, 在深度學習通常使用 cross_entropy (Cross entropy) 交叉摘順練效果較好.
  • optimizer: 設定訓練時的優化方法, 在深度學習使用 adam 可以讓訓練更快收斂, 並提高準確率.
  • metrics: 設定評估模型的方式是 accuracy (準確率)
# 2.開始訓練 
train_history = model.fit(x=x_Train_norm, y=y_TrainOneHot, validation_split=0.2, epochs=10, batch_size=200, verbose=2)  

上面訓練過程會儲存於 train_history 變數中:

  • x=x_Train_norm: features 數字的影像特徵值 (60,000 x 784 的陣列).
  • y=y_Train_OneHot: label 數字的 One-hot encoding 陣列 (60,000 x 10 的陣列)
  • validation_split = 0.2: 設定訓練資料與 cross validation 的資料比率. 也就是說會有 0.8 * 60,000 = 48,000 作為訓練資料; 0.2 * 60,000 = 12,000 作為驗證資料.
  • epochs = 10: 執行 10 次的訓練週期.
  • batch_size = 200: 每一批次的訓練筆數為 200
  • verbose = 2: 顯示訓練過程. 共執行 10 次 epoch (訓練週期), 每批 200 筆, 也就是每次會有 240 round (48,000 / 200 = 240). 每一次的 epoch 會計算 accuracy 並記錄在 train_history 中.
# 3.建立 show_train_history 顯示訓練過程 
# 訓練步驟會將每一個訓練週期的 accuracy 與 loss 記錄在 train_history 變數
# 讀取 train_history 以圖表顯示訓練過程: 
import matplotlib.pyplot as plt
def show_train_history(train_history,train,validation):

  plt.plot(train_history.history[train])
  plt.plot(train_history.history[validation])
  plt.title('Train history')
  plt.ylabel('train')
  plt.xlabel('epoch')
  # 設置圖例在左上角
  plt.legend(['train','validation'],loc='upper left')
  plt.show()

show_train_history(train_history,'accuracy','val_accuracy')
show_train_history(train_history,'loss','val_loss') 

如果 “accuracy 訓練的準確率” 一直提升,但是 “val_accuracy 的準確率” 卻一直沒有增加,可能是 Overfitting 的現象.
在完成所有 (epoch) 訓練週期後,在後面還會使用測試資料來評估模型準確率, 這是另外一組獨立的資料,所以計算準確率會更客觀.

總共執行 10 個 Epoch 訓練週期, 發現:
不論訓練與驗證, 誤差越來越低.
在 Epoch 訓練後期, “loss 訓練的誤差” 比 “val_loss 驗證的誤差” 小.


上一篇
DAY 22 YOLOv4 MNIST手寫數字辨識資料
下一篇
DAY 24 YOLOv4 MNIST手寫數字辨識資料 -3
系列文
Diffusion 模型、物件偵測Yolo v7& Yolo v4 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言